package edzest.basic;

public class J16_Printer {
	public static void main(String[] args){
		// 인터페이스 활용하기
		
	}// main
}// class

class PrinterV2 { 
	private String model;
	private String maker;
	private String type;
	private int papers;
	private int remain;
	
	// J15_Printer 클래스와 달리
	// 메서드는 정의하지 않음
	// 상속관계에 의해 부모클래스의 메서드가
	// 무시당할(쓰이지않을) 것이므로 아예 만들지 않음
}

// 모든 프린터가 기본적으로 제공해야 하는 기능
// 표준 기능을 인터페이스로 작성
interface PrinterV2Service{
	void print();
	int showRemain();
}

// PrinterV2 클래스와
// PrinterV2Service 인터페이스를
// 이용해서 Inkjet, Laser 프린터 클래스 작성
class InkjetPrinterV2 extends PrinterV2
	implements PrinterV2Service{

	@Override
	public void print() {
		System.out.println( "잉크젯 프린터입니다!!" );
	}

	@Override
	public int showRemain() {
		return 100;
	}
	
}

class LaserPrinterV2 extends PrinterV2
	implements PrinterV2Service{

	@Override
	public void print() {
		System.out.println( "레이저 프린터입니다!!" );
	}

	// 잉크잔량보여주기는 레이저 프린터에서는 제공하지 않는 기능이지만
	// 인터페이스를 구현했으므로
	// 어쩔수 없이 showRemain 메서드에 있는 모든 메서드 재정의
	// 즉, 필요없지만 약속에 의해 어거지로 작성함
	// JSP 쪽 가면 이렇게 필요없는 메서드 여러개 나옴
	@Override
	public int showRemain() {
		return 0; 
	}
	
}

// 잉크젯/레이저 프린터 클래스를 작성하기 위해
// extends와 implements 예약어를 사용하는 것은
// 왠지 복잡해 보임
// 또, 특정 클래스에서 사용하지 않는 메서드임에도 불구하고
// 인터페이스 규칙상 작성해야 하는 불편함도 존재
// (예, Inkjet : print(), showRemain() )
// (예, Laser : print() 만 제공 )
// 따라서, 이것을 간편하게 작성하기 위해 
// 기본 base 클래스 개념을 도입함
// 나중에 배우는 서블릿, JSP도 기본 base 클래스로 만듬
interface PrinterV3Service {
	void print();
	int showRemain();
}

// 기본 base 클래스
// 기본 base 클래스에서 추상메서드 재정의 해줬기 때문에
// 이 클래스를 상속받는 클래스는 필요없는 메서드 재정의 해줄 필요 없음
class PrinterV3 implements PrinterV3Service {
	private String model;
	private String maker;
	private String type;
	private int papers;
	private int remain;
	
	@Override
	public void print() {
		System.out.println("프린터입니다!");	
	}

	@Override
	public int showRemain() {
		return 0;
	}
}

class InkjetPrinterV3 extends PrinterV3 {
	@Override
	public void print() {
		System.out.println( "잉크젯프린터입니다!" );
	}
	
	// 잉크젯프린터는 이 메서드 필요해서 재정의 함
	@Override
	public int showRemain() {
		return 100;
	}
}

// LaserPrinter는 showRemain() 메서드 필요없는데
// 기본 base 클래스를 상속해서 필요없는 메서드 재정의 안해도 됨
// 기본 base 클래스에서 재정의 해줬기때문
class LaserPrinterV3 extends PrinterV3 {
	@Override
	public void print() {
		System.out.println( "레이저프린터입니다!" );
	}
}

// 기본 클래스를 도입해서
// 잉크젯/레이저 프린터 클래스 작성시
// 상당히 간편함을 알 수 있음
// 또한, 인터페이스를 사용하더라도
// 용도에 따라 메서드 재작성을 취사선택할 수 있음